# -*- coding: utf-8 -*-
# @Time    : 2024/6/25 14:09
# @Author  : yujiahao
# @File    : 10_pandas_nan.py
# @description:Python Pandas缺失值处理


'''
在一些数据分析业务中，数据缺失是我们经常遇见的问题，缺失值会导致数据质量的下降，从而影响模型预测的准确性，这对于机器学习和数据挖掘影响尤为严重。
因此妥善的处理缺失值能够使模型预测更为准确和有效。

【为什么会存在缺失值】

    其实在很多时候，人们往往不愿意过多透露自己的信息。假如您正在对用户的产品体验做调查，在这个过程中您会发现，
    一些用户很乐意分享自己使用产品的体验，但他是不愿意透露自己的姓名和联系方式；还有一些用户愿意分享他们使用产品的全部经过，
    包括自己的姓名和联系方式。因此，总有一些数据会因为某些不可抗力的因素丢失，这种情况在现实生活中会经常遇到。

【什么是稀疏数据】

    稀疏数据，指的是在数据库或者数据集中存在大量缺失数据或者空值，我们把这样的数据集称为稀疏数据集。
    稀疏数据不是无效数据，只不过是信息不全而已，只要通过适当的方法就可以“变废为宝”。

    稀疏数据的来源与产生原因有很多种，大致归为以下几种：
        - 由于调查不当产生的稀疏数据；
        - 由于天然限制产生的稀疏数据；
        - 文本挖掘中产生的稀疏数据。



'''
import pandas as pd
import numpy as np


def pandas_nan():
    df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'])

    print('原始数据：\n', df)

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

    print('重置索引之后的数据有缺失值：\n', df)
    # 可以用标量值替换NAN的值，用 0 填充 NaN
    print(df.fillna(0))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # 向前和向后填充NA
    ''' ffill() 向前填充和 bfill() 向后填充，使用这两个函数也可以处理 NA 值'''

    print(df.fillna(method='ffill'))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # 删除缺失值

    '''如果想删除缺失值，那么使用 dropna() 函数与参数 axis 可以实现。在默认情况下，按照 axis=0 来按行处理，这意味着如果某一行中存在 NaN 值将会删除整行数据。
    
    dropna() 函数详解
        
        默认行为:
        
        axis=0（默认值）：按行删除，即如果某一行中存在 NaN 值，将删除该行。
        axis=1：按列删除，即如果某一列中存在 NaN 值，将删除该列。
        参数:
        
        how='any'（默认值）：只要存在 NaN 值，就删除该行或列。
        how='all'：只有当所有值都是 NaN 时，才删除该行或列。
    
    '''

    print(df.dropna(axis=1))


def main():
    pandas_nan()


if __name__ == '__main__':
    main()
